package com.vlyman.weixin.send;

import com.alibaba.fastjson.JSONObject;
import com.vlyman.weixin.consts.WxUriConsts;
import com.vlyman.weixin.entity.*;
import com.vlyman.weixin.utils.HttpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;

import java.util.*;

/**
 * 类描述：
 *  统一服务消息工具类
 *  PS.下发小程序和公众号统一的服务消息
 * @author chenjs
 * @date 2021/6/9 15:51
 **/
@Slf4j
public class SendUniformMsg {

    /**
     * 常量
     */
    private final static String RTN_OK = "ok";

    /**
     * 方法描述：
     *   发送统一服务消息
     *   PS.仅下发公众号统一的服务消息
     *  @author chenjs
     *  @param accessToken      接口调用凭证(小程序的)
     *  @param openid           用户openid，可以是小程序的openid，也可以是对应的公众号的openid
     *  @param mpAppId          公众号的AppId
     *  @param templateId       公众号里设置的模板消息id
     *  @param miniprogram      跳小程序所需数据
     *  @param firstMD          模板头部填充数据
     *  @param keywordMDList    模板关键填充数据
     *  @param remarkMD         模板尾部填充数据
     *  @return boolean
     *  @date 2021/6/13 11:20
     */
    public static boolean sendUniformMessageToMp(String accessToken, String openid, String mpAppId, String templateId,
                                                 MessageMiniProgramVo miniprogram, MessageDataVo firstMD,
                                                 List<MessageDataVo> keywordMDList, MessageDataVo remarkMD){
        MpTemplateMessageVo mpMsg = new MpTemplateMessageVo();
        mpMsg.setAppid(mpAppId);
        mpMsg.setTemplate_id(templateId);
        mpMsg.setMiniprogram(miniprogram);
        Map<String, MessageDataVo> data = new HashMap<>(8);
        data.put("first", firstMD);
        data.put("remark", remarkMD);
        Iterator<MessageDataVo> itr = keywordMDList.iterator();
        int index = 1;
        while (itr.hasNext()) {
            MessageDataVo keywordData = itr.next();
            data.put("keyword"+index, keywordData);
            index++;
        }
        mpMsg.setData(data);
        return sendUniformMessage(accessToken, openid, mpMsg);
    }

    /**
     * 方法描述：
     *   发送统一服务消息(自定义key)
     *   PS.仅下发公众号统一的服务消息
     *  @author chenjs
     *  @param accessToken      接口调用凭证(小程序的)
     *  @param openid           用户openid，可以是小程序的openid，也可以是对应的公众号的openid
     *  @param mpAppId          公众号的AppId
     *  @param templateId       公众号里设置的模板消息id
     *  @param miniprogram      跳小程序所需数据
     *  @param dataList         模板填充数据
     *  @return boolean
     *  @date 2023/6/18 16:49
     */
    public static boolean sendUniformCustomerMessageToMp(String accessToken, String openid, String mpAppId, String templateId,
                                                 MessageMiniProgramVo miniprogram, List<MessageCustomerDataVo> dataList){
        MpTemplateMessageVo mpMsg = new MpTemplateMessageVo();
        mpMsg.setAppid(mpAppId);
        mpMsg.setTemplate_id(templateId);
        mpMsg.setMiniprogram(miniprogram);
        Map<String, MessageDataVo> data = new HashMap<>(8);
        for (MessageCustomerDataVo customerData : dataList) {
            data.put(customerData.getKey(), customerData.getValue());
        }
        mpMsg.setData(data);
        return sendUniformMessage(accessToken, openid, mpMsg);
    }

    /**
     * 方法描述：
     *   下发小程序和公众号统一的服务消息
     *  @author chenjs
     *  @param accessToken  接口调用凭证(小程序的)
     *  @param openid       用户openid，可以是小程序的openid，也可以是mp_template_msg.appid对应的公众号的openid
     *  @param mpMsg        公众号模板消息相关的信息，可以参考公众号模板消息接口；
     *  @return boolean
     *  @date 2021/6/13 11:17
     */
    public static boolean sendUniformMessage(String accessToken, String openid, MpTemplateMessageVo mpMsg) {
        try {
            UniformMessageSendVo sendVo = new UniformMessageSendVo(openid, mpMsg);
            String response = HttpUtil.post(WxUriConsts.WX_UNIFORM_MSG_SEND.concat(accessToken), JSONObject.toJSONString(sendVo));
            JSONObject jObj = JSONObject.parseObject(response);
            String errmsg = jObj.getString("errmsg");
            if (StringUtils.isNotBlank(errmsg) && RTN_OK.equals(errmsg)) {
                return true;
            } else {
                log.error("调用微信发送统一服务消息接口失败！返回报文："+response);
                return false;
            }
        } catch (Exception e) {
            log.error("调用微信发送统一服务消息接口失败！", e);
            return false;
        }
    }
}
